Proj: Natural number gameを解く
Lean 4版
rfl
Goalが左辺=右辺なら証明完了
rw [one_eq_succ_zero]
1ならsucc 0になる
rw [← one_eq_succ_zero]で定理?を逆向きに適用する
succ 0なら1になる
ログ
Tutorial World
First unravel the 1.
1
Tutorial worldまでクリアできた
rw [one_eq_succ_zero] でn+1の1をsucc 0にできる
rw [add_succ]で n + succ 0 → succ (n + 0)にできる
rw [add_zero]でsucc (n + 0)をsucc nにできる
右上の</>をクリックするとエディターモードになる
inductionはinduction n with d hd のように書く
Level 2 / 5 : succ_add
code:memo
induction b with h hd
rfl
rfl
assumption(仮定)のhdで、ゴールをrwできることがわかれば解けるようになる
Multiplication World完了、Implication World完了
repeatはrepeat rw [zero_add] at hのように使う
intro hで仮定を作る?
exact hで仮定とゴールを比較する
apply h2 at h1なら仮定h2を仮定h1に適用する
code:memo
h1: x = 37
h2: x = 37 → y = 42
↓ (apply h2 at h1)
h2: x = 37 → y = 42
h1: y = 42
apply succ_inj at hなら仮定hのsuccを除去する
succ(a) = succ(b)→a = b
code:memo
h: succ (succ 0) = succ (succ (succ 0))
↓ apply succ_inj at h
h: succ 0 = succ (succ 0)
apply succ_injならゴールに適用する
メモ
World: Algorithm World Level 6 / 9 : is_zero
code:memo.lean
theorem succ_ne_zero (a : ℕ) : succ a ≠ 0 := by
intro h
-- h: succ a = 0, Goal: is_zero (succ a)
trivial
Goal: is_zero (succ a)のときにtrivialにすると解決される
仮定hが矛盾
World: Algorithm World Level 8 / 9 : decide
型クラスのインスタンスが定義されているのでdecideでいい感じに証明してくれるらしい
code:instDecidableEq.lean
instance instDecidableEq : DecidableEq ℕ
| 0, 0 => isTrue <| by
show 0 = 0
rfl
| succ m, 0 => isFalse <| by
show succ m ≠ 0
exact succ_ne_zero m
| 0, succ n => isFalse <| by
show 0 ≠ succ n
exact zero_ne_succ n
| succ m, succ n =>
match instDecidableEq m n with
| isTrue (h : m = n) => isTrue <| by
show succ m = succ n
rfl
| isFalse (h : m ≠ n) => isFalse <| by
show succ m ≠ succ n
exact succ_ne_succ m n h
decide、Decidableについて
2024-08-xx
comtraposeタクティクを使うと良い場合がある
le_transはわからなかったので答えを見た...
≤ World Level 5 / 11 : x ≤ 0 → x = 0
code:lean
theorem le_zero (x : ℕ) (hx : x ≤ 0) : x = 0 := by
cases x
rfl
cases hx
symm at h
contrapose h
apply succ_ne_zero
なぜ証明できているか全然わからない。どうしてcases hxを使用するとassumptionsがsucc a ≦ 0からh: 0 = succ a + wに変化するのか全然わからない
code:memo
Objects:
a: ℕ
Assumptions:
hx: succ a ≤ 0
Goal:
succ a = 0
↓
Current Goal
Objects:
aw: ℕ
Assumptions:
h: 0 = succ a + w
Goal:
succ a = 0
何をしたらよいかわからなくなった
code:memo
theorem le_antisymm (x y : ℕ) (hxy : x ≤ y) (hyx : y ≤ x) : x = y := by
cases x with d1 hd1
cases y with d2 hd2
rfl
cases hyx
symm
contrapose h
apply zero_ne_succ
cases hxy with d3 hd3
cases hyx with d4 hd4
symm
contrapose! hd4
apply succ_ne_succ
-- intro h
-- symm at h
-- apply h at hd4